#pragma once


#include <memory>
#include <string>
#include <tchar.h>


namespace std
{
#ifdef _UNICODE
	typedef wstring tstring;
#else !_UNICODE
	typedef string tstring;
#endif // _UNICODE
} // namespace std


class Bank;
class Expression;
typedef std::shared_ptr<Expression> ExpressionSp;
typedef std::shared_ptr<const Expression> CExpressionSp;
class Expression : public std::enable_shared_from_this<Expression>
{
public:
	virtual bool operator ==( const Expression& cExpression ) const = 0;
	bool operator !=( const Expression& cRight ) const;
	virtual ExpressionSp operator *( int iMultiplier ) const = 0;
	virtual ExpressionSp operator +( const Expression& cAddend ) const = 0;
	virtual ExpressionSp Reduce( const Bank& cBank, const std::tstring& cstrCurrency ) const = 0;

}; // class Expression
